package com.system.service;

import com.system.controller.LoginController;
import com.system.domin.MemoUser;
import com.system.domin.User;
import com.system.untils.EmailVerification;

import java.util.HashSet;
import java.util.Scanner;
import java.util.regex.Pattern;

public class Login {
    public  final Scanner sc;
    private final LoginController controller;
    private final EmailVerification ev = new EmailVerification();

    public Login() {
        controller = new LoginController();
        this.sc = new Scanner(System.in);
    }

    /**
     * 验证邮箱是否为有效的QQ邮箱
     */
    private boolean isQQEmail(String email) {
        String regex = "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@qq\\.com$";
        return Pattern.compile(regex).matcher(email).matches();
    }

    /**
     * 验证注册邮箱的输入
     */
    private String validateEmailForSignup(String email) {
        while (true) {
            if (!isQQEmail(email)) {
                System.out.println("不是正确的QQ邮箱，请重新输入：");
                email = sc.next();
            } else if (controller.getUserDataMapper().selectByEmailController(email)) {
                System.out.println("邮箱已存在，请重新输入：");
                email = sc.next();
            } else {
                return email; // 格式正确且邮箱不存在，返回邮箱
            }
        }
    }

    /**
     * 验证用户输入的密码
     * @param password 用户输入的密码
     * @return 合法的密码
     */
    private String validatePasswordInput(String password) {
        while (true) {
            if (password.length() == 6) {
                return password; // 密码合法
            } else {
                System.out.println("密码必须是6位，请重新输入：");
                password = sc.next(); // 重新读取输入
            }
        }
    }
    /**
     * 验证用户输入的验证码
     * @param sendCode 系统发送的验证码
     * @return 验证成功返回true，否则返回false
     */
    private boolean verifyVerificationCode(String sendCode) {
        int attempts = 0;
        while (attempts < 3) {
            System.out.println("请输入验证码：");
            String userInput = sc.next(); // 读取用户输入

            if (userInput.equals(sendCode)) {
                System.out.println("验证码验证成功！");
                return true; // 验证码正确
            } else {
                attempts++;
                System.out.println("验证码错误！还有 " + (3 - attempts) + " 次机会。");
            }
        }
        System.out.println("验证码错误次数过多！");
        return false; // 超过3次错误
    }

    /**
     * 用户注册
     */
    public String scannerSignup() {
        System.out.println("请输入邮箱：");
        String email = validateEmailForSignup(sc.next());

        System.out.println("请输入密码(6位)：");
        String password = validatePasswordInput(sc.next());

//        try {
            String verificationCode = ev.send(email);
            if (verifyVerificationCode(verificationCode)) {
                User user = new User(email, password);
                controller.getUserDataMapper().insert(user);
                MemoUser memoUser = new MemoUser(email, inspectNameSup(email));
                // 初始化memoUser
                controller.getMUT().getMdm().initMemoUser(memoUser);
                System.out.println("注册成功！");
                return email;

            } else {
                System.out.println("验证码错误过多，请重新注册！");
            }
//        } catch (Exception e) {
//            System.out.println("邮箱发送失败，请重新注册！");
//        }
        return null;
    }

    /**
     * 用户登录
     */
    public String login() {
        String email = "";
        String password;
        boolean loginSuccess = false;

        while (!loginSuccess) {
            System.out.println("请输入邮箱：");
            email = sc.next();

            // 检查邮箱是否存在
            if (controller.getAssignNameMapper().isInspect(email)) {
                // 用户已存在，继续登录
                System.out.println("请输入密码(6位)：");
                password = sc.next();

                // 检查密码
                if (signInProblem(email, password)) {
                    this.controller.getMUT().getMdm().updateMainUser(email);
                    loginSuccess = true; // 登录成功
                } else {
                    System.out.println("密码错误，请重新输入。");
                }
            } else {
                // 用户不存在，给出选择注册还是重新输入邮箱
                System.out.println("用户不存在，请选择是否注册：");
                System.out.println("输入 'y' 继续输入邮箱（重新登录），输入 'n' 进行注册");

                String choice = sc.next();
                if (choice.equalsIgnoreCase("y")) {
                    // 重新输入邮箱
                    System.out.println("请重新输入邮箱：");
                } else if (choice.equalsIgnoreCase("n")) {
                    // 进入注册流程
                    scannerSignup();
                    break; // 退出当前循环，进行注册流程
                } else {
                    System.out.println("无效输入，请输入 'y' 或 'n'。");
                }
            }
        }
        return email; // 登录成功，返回邮箱
    }
    public boolean signInProblem(String email, String password) {
        // 检查邮箱和密码是否匹配
        if (controller.getUserDataMapper().selectForLogin(email, password)) {
            System.out.println("登录成功！");
            return true;
        } else {
            System.out.println("邮箱或者密码错误！");
            return false;
        }
    }
    private String inspectNameSup(String email) {
//        String name = controller.getGetRandName().generateMeaningfulEnglishName();  // 分配和检查同时进行
//        HashSet<String> allName = controller.getAssignNameMapper().loadALLName();
//        if (allName.add(name))  // ture 说明添加进去了且今天没有重复的name
//        {
//            /*
//             *  注册，初始化memoUser对象
//             */
//            // 修改当前邮箱的name
//            MemoUser user = new MemoUser(email, name);
//            controller.getAssignNameMapper().addName(email, name);
//            controller.getMUT().getMdm().initMemoUser(user);  // 先添加
//            // 初始化notification
//            controller.getMUT().getMdm().initNotification(email);
////            controller.getMUT().getMdm().getInit(email); // 再拿
//            return name;
//        } else {
//            inspectNameSup(email); // 重新
//        }
        while (true)
        {
            String name = controller.getGetRandName().generateMeaningfulEnglishName();  // 分配和检查同时进行
            HashSet<String> allName = controller.getAssignNameMapper().loadALLName();
            if (allName.add(name))  // ture 说明添加进去了且今天没有重复的name
            {
                return name;
            } else
            {
                System.out.println("继续重新分配！");
            }
        }
    }
}
